/******************************************************************************* 
  Copyright (C), 1988-2020, zeno Tech. Co., Ltd.
  Description:  SYS网络模块
  Function List:
            
*******************************************************************************/

#ifndef SYS_NETCFG_H
#define SYS_NETCFG_H

#ifdef __cplusplus
extern "C" {
#endif

/*=============================================================================
                                 Includes                                  
==============================================================================*/

/*=============================================================================
                               Macro Definition
==============================================================================*/
#define ETH_PHY_NUM         4			/* 最大物理网卡数目 */
#define ETH_VIR_NUM         4			/* 最大虚拟网卡数目 */

/*=============================================================================
                        Local Structures and Typedef 
==============================================================================*/
/* IPV6地址类型 */
typedef enum 
{
    NET_IPV6_ANY,
    NET_IPV6_UNICAST,
    NET_IPV6_MULTICAST,
    NET_IPV6_ANYCAST,
    NET_IPV6_LOOPBACK,
    NET_IPV6_LINKLOCAL,
    NET_IPV6_SITELOCAL,
    NET_IPV6_COMPATv4
} NET_ipv6Scope_t;

/* DNS信息结构体 */
typedef struct 
{
    char priV4[32];
    char secV4[32];
    char priV6[64];
    char secV6[64];
} SYS_netDns_t;

/* 网卡信息结构体指针 */
typedef struct
{
    int ethNum;							/* 网卡数 */
    char ethName[ETH_PHY_NUM][16];		/* 网卡名 */
}SYS_ethInfo_t;

/*=============================================================================
                             extern  Variables                                  
==============================================================================*/


/*=============================================================================
                             Function Definition                                  
==============================================================================*/ 

/*******************************************************************************
  Function:     SYS_GetGateway
  Description:  获取底层的网关
  Input:        -len，网关长度
  Output:       -gateway，网关指针
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_GetGateway(char *pGateway, int len);

/*******************************************************************************
  Function:     SYS_GetIpaddr
  Description:  获取底层的ip地址
  Input:        -pInterfaceName,网卡接口
                -len，ip地址长度
  Output:       -pIpaddr，ip地址
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_GetIpaddr(char *pInterfaceName, char *pIpaddr, int len); 

/*******************************************************************************
  Function:     SYS_GetMac
  Description:  获取设备mac地址
  Input:        -pInterfaceName,网卡接口
                -len，mac地址长度
  Output:       -pMac，mac地址指针
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_GetMac(char * pInterfaceName, char * pMac , int len);

/*******************************************************************************
  Function:     SYS_GetMacNum
  Description:  获取mac地址长度
  Input:        -pInterfaceName,网卡接口
                -len，mac地址长度
  Output:       -pMac，mac地址指针
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_GetMacNum(char * pInterfaceName, char * pMac ,int len);

/*******************************************************************************
  Function:     SYS_GetNetmask
  Description:  获取底层的子网掩码
  Input:        -pInterfaceName,网卡接口
                -len，子网掩码长度
  Output:       -pNetmask，子网掩码指针
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_GetNetmask(char * pInterfaceName, char * pNetmask, int len);

/*******************************************************************************
  Function:     SYS_IfUp
  Description:  开启网卡
  Input:        -pInterfaceName,网卡接口
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_IfUp(char * pInterfaceName);

/*******************************************************************************
  Function:     SYS_IfDown
  Description:  关闭网卡
  Input:        -pInterfaceName,网卡接口
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_IfDown(char * pInterfaceName);

/*******************************************************************************
  Function:     SYS_SetIpaddr
  Description:  设置底层的ip地址
  Input:        -pInterfaceName,网卡接口
                -pIpaddr，ip地址
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_SetIpaddr(char * pInterfaceName,char * pIpaddr);

/*******************************************************************************
  Function:     SYS_SetMac
  Description:  设置设备mac地址
  Input:        -pInterfaceName,网卡接口
                -pMac，mac地址指针
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_SetMac(char* pInterfaceName,char * pMac);

/*******************************************************************************
  Function:     SYS_DelGateway
  Description:  删除网关
  Input:        无
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_DelGateway(void);

/*******************************************************************************
  Function:     SYS_IsSameSubnet
  Description:  判断是否是相同的子网段
  Input:        - pEthName : 网卡名
  				- pGateway : 网关指针
  Output:       无
  Return:       0: 不是
                1: 是
  Others:       无
*******************************************************************************/
int SYS_IsSameSubnet(char *pEthName, char *pGateway);

/*******************************************************************************
  Function:     SYS_SetGateway
  Description:  设置网关
  Input:        - pEthName ： 网卡名
  				- pGateway ： 网关指针
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_SetGateway(char *pEthName, char * pGateway);

/*******************************************************************************
  Function:     SYS_SetRoute
  Description:  设置路由
  Input:        - pEthName ： 网卡名   
  				- pRoute ： 路由地址
                -pMask，子网掩码
                -ishost，是否是虚拟主机
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_SetRoute(char *pEthName, char * pRoute,char * pMask, int ishost);

/*******************************************************************************
  Function:     SYS_DelRoute
  Description:  删除路由设置
  Input:        - pEthName ： 网卡名   
  				- pRoute ： 路由地址
                - pMask ： 子网掩码
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_DelRoute(char *pEthName, char * pRoute,char * pMask);

/*******************************************************************************
  Function:     SYS_SetNetmask
  Description:  设置子网掩码
  Input:        - pEthName ： 网卡名     
  				- pInterfaceName ： 网卡接口
                - pNetmask ： 子网掩码指针
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_SetNetmask(char * pInterfaceName,char * pNetmask);

/*******************************************************************************
  Function:     SYS_SetBroadcast
  Description:  设置广播
  Input:        -pInterfaceName,网卡接口
                -pBroadcast，广播指针
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_SetBroadcast(char * pInterfaceName,char* pBroadcast);

/*******************************************************************************
  Function:     SYS_GetBroadcast
  Description:  获取广播地址
  Input:        -pInterfaceName,网卡接口
                -len，广播地址长度
  Output:       -pBroadcast，广播地址指针
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_GetBroadcast(char * pInterfaceName,char * pBroadcast,int len);

/*******************************************************************************
  Function:     SYS_SetNetParam
  Description:  设置网络接口参数
  Input:        -pInterfaceName,网卡接口
                -speed，网络带宽
                -duplex，dup
                -autoneg，索引
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_SetNetParam(char *pInterfaceName, int speed, int duplex, int autoneg);

/*******************************************************************************
  Function:     SYS_SetEthMode
  Description:  设置网卡类型
  Input:        -val,类型值
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_SetEthMode(unsigned int val);

/*******************************************************************************
  Function:     SYS_SetMtu
  Description:  设置MTU值
  Input:        -pInterfaceName,网卡接口
                -mtu，MTU值
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_SetMtu(char * pInterfaceName, int mtu);

/*******************************************************************************
  Function:     SYS_GetMtu
  Description:  获取MTU值
  Input:        - pInterfaceName: 网卡接口    
  Output:       - pMtu: MTU值
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_GetMtu(char *pInterfaceName, int *pMtu);

/*******************************************************************************
  Function:     SYS_GetIpaddr6
  Description:  获取底层的ipv6地址
  Input:        - pInterfaceName: 网卡接口
  Output:       - pIpaddr: ip地址
                - pRefixlen: 掩码
                - scope: ipv6地址类型
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_GetIpaddr6(char *pInterfaceName, 
                   char *pIpaddr, 
                   char *pRefixlen,
                   NET_ipv6Scope_t scope);

/*******************************************************************************
  Function:     SYS_SetIpaddr6
  Description:  设置底层的ipv6地址
  Input:        - pInterfaceName: 网卡接口
                - pIpaddr: ip地址
                - pRefixlen: 掩码
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_SetIpaddr6(char *pInterfaceName, char *pIpaddr, char *pRefixlen);

/*******************************************************************************
  Function:     SYS_GetGetWay6
  Description:  设置底层的ipv6网关
  Input:        - pInterfaceName: 网卡接口
  Output:       - pGetway: 网关
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_GetGetWay6(char *pInterfaceName, char *pGetway);

/*******************************************************************************
  Function:     SYS_AddRoute6
  Description:  增加ipv6网关
  Input:        - pInterfaceName: 网关指针
                - pRoute: 路径
                - pRefixlen: 掩码
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_AddRoute6(char *pInterfaceName, char *pRoute, char *pRefixlen);

/*******************************************************************************
  Function:     SYS_DelRoute6
  Description:  删除ipv6网关
  Input:        - pInterfaceName: 网关指针
                - pRoute: 路径
                - pRefixlen: 掩码
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_DelRoute6(char *pInterfaceName, char *pRoute, char *pRefixlen);

/*******************************************************************************
  Function:     SYS_SetGateway6
  Description:  设置pv6网关
  Input:        - pGateway: 网关指针
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_SetGateway6(char *pInterfaceName, char *pGateway);

/*******************************************************************************
  Function:     SYS_AddGateway6
  Description:  增加ipv6网关
  Input:        - pGateway: 网关指针
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_AddGateway6(char *pInterfaceName, char *pGateway);

/*******************************************************************************
  Function:     SYS_DelGateway6
  Description:  删除ipv6网关
  Input:        - pGateway: 网关指针
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_DelGateway6(char *pInterfaceName, char *pGateway);

/*******************************************************************************
  Function:     SYS_GetAddrFamily
  Description:  获取IP的版本
  Input:        - pIp: ip地址
  Output:       无
  Return:       AF_INET: version 4
                AF_INET6:  version 6
                0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_GetAddrFamily(const char *pIp);

/*******************************************************************************
  Function:     SYS_NetGetDnsAddress
  Description:  获取DNS地址
  Input:        - pPrimary: 首选的DNS服务器地址字符串。
                - plen: DNS服务器地址长度,要大于16
                - pSecondary: 备选的DNS服务器地址字符串。
                - plen: 备选的DNS服务器地址长度,要大于16
                - ipType: AF_INET: IPV4 AF_INET6: IPV6
  Output:       无
  Return:       0: 操作成功
                <0: 操作失败
  Others:       无
*******************************************************************************/
int SYS_NetGetDnsAddress(char *pPrimary, 
                         const int plen ,
                         char *pSecondary, 
                         const int slen,
                         unsigned int ipType);

/*******************************************************************************
  Function:     SYS_NetSetDnsAddress
  Description:  设置主机DNS地址
  Input:        -pPrimary: 首选DNS服务器地址点分字符串
                -pSecondary: 备选DNS服务器地址点分字符串
                - ipType: AF_INET: IPV4 AF_INET6: IPV6
  Output:       无
  Return:       0: 操作成功
                -1: 操作失败
  Others:       无
*******************************************************************************/
int SYS_NetSetDnsAddress(const char * pPrimary, 
                         const char * pSecondary, 
                         unsigned int ipType);

/*******************************************************************************
  Function:     SYS_NetDelDnsAddress
  Description:  删除主机DNS地址
  Input:        - ipType: AF_INET: IPV4 AF_INET6: IPV6
  Output:       无
  Return:       0: 操作成功
                -1: 操作失败
  Others:       无
*******************************************************************************/
int SYS_NetDelDnsAddress(unsigned int ipType);

/*******************************************************************************
  Function:     SYS_GetEthDevice
  Description:  获取网卡设备，网卡数
  Input:        无
  Output:       -pEthInfo: 网卡信息结构体指针
  Return:       0: 操作成功
                -1: 操作失败
  Others:       无
*******************************************************************************/
int SYS_GetEthDevice(SYS_ethInfo_t *pEthInfo);

#ifdef __cplusplus
}
#endif

#endif /*SYS_NETCFG_H*/
